package com.zzyy.study.controller;

import cn.hutool.core.util.IdUtil;
import com.zzyy.study.config.CacheFrontendContext;
import com.zzyy.study.entities.Customer;
import com.zzyy.study.resp.ResultData;
import com.zzyy.study.service.CustomerService;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.web.bind.annotation.*;

/**
 * @auther zzyy
 * @create 2024-01-20 18:20
 */
@RestController
@Slf4j
public class CustomerController
{
    @Resource
    private CustomerService customerService;

    @PostMapping(value = "/customer/add")
    public int add(@RequestBody Customer customer)
    {
        return customerService.add(customer);
    }

    @GetMapping(value = "/customer/get/{id}")
    public ResultData<Customer> getCustomerById(@PathVariable("id") Integer id)
    {
        Customer result = customerService.getCustomerById(id);

        return ResultData.success(result);
    }


    // Caffeine + redis演示多级缓存2024.3.3
    @Resource
    private CacheFrontendContext cacheFrontendContext;
    @Resource
    private StringRedisTemplate stringRedisTemplate;

    @GetMapping(value = "/customer/cache/set")
    public String set(String key)
    {
        String value = IdUtil.simpleUUID();
        stringRedisTemplate.opsForValue().set(key,value);
        return "set cache success, key: "+key+"\t"+"value: "+value;
    }

    @GetMapping(value = "/customer/cache/get")
    public String get(String key)
    {
        return cacheFrontendContext.getCacheFrontend().get(key).toString();
    }

}

/**
 * 0 新增k1进redis，如之前有先删除，http://localhost:2433/customer/cache/set?key=k1
 *
 * 1 先get k1 ，localCacheCaffeine get后本地咖啡因没有，立刻去查redis，然后将redis查到的数据put写入localCacheCaffeine
 *              caffeine get:k1
 *              caffeine put:k1,1d5b27dfeadd4fc581b3c9beaf87a2ab
 *
 *   1.1  再多次get，http://localhost:2433/customer/cache/get?key=k1
 *              只有caffeine get:k1后台出现，表示直接从本地咖啡因获取了。
 *
 * 2 set k1, 将远程redis的key1修改为新值了，此时观察控制台看到localCacheCaffeine自动evict key1
 *          -----监听到远程redis有变化，属性type:invalidate,connect:[invalidate, [k1]]
 *              将自己的本地key1值作废，准备重查新添
 *
 * 3 再get k1 ，后台同第一步效果，先本地get不到后自取远程redis，最后put给自己本地
 *          caffeine get:k1
 *          caffeine put:k1,cacheV2
 *
 * 4 多次get看后台，只会从自己本地缓存取得，不再找redis
 *      caffeine get:k1
 *      caffeine get:k1
 *      caffeine get:k1
 *
 * 5 人工手动修改redis的k1值，idea后台看到效果，自动将自己的本地key1值作废，准备重查新添
 *   http://localhost:2433/customer/cache/get?key=k1
 *
 * 6 断线重链，你如何处理？
 *   手动shutdown关闭远程redis，看看后台效果，此时访问可以从本部获得数据不会
 *   因为远程redis挂了数据over；然后再启动redis看后台发现重新链接上了redis
 *
 * 7 手动修改下redisxxxxxx
 *
 *
 */

